<?php
//参考：http://blog.csdn.net/kylinbl/article/details/8155382
//验证码类
class Captcha {
	private $charset = '23456789'; //随机因子
	private $code; //验证码
	private $codelen = 4; //验证码长度
	private $width = 100; //宽度
	private $height = 50; //高度
	private $img; //图形资源句柄
	private $font; //指定的字体
	private $density = 1; //文字与文字间隔密度
	private $fontsize = 20; //指定字体大小
	private $fontcolor = "#0404f8"; //指定字体颜色
	

	//构造方法初始化
	public function __construct() {
		$this->font = './config/captcha.ttf'; //注意字体路径要写对，否则显示不了图片
	}
	
	//生成随机码
	private function createCode() {
		$_len = strlen ( $this->charset ) - 1;
		for($i = 0; $i < $this->codelen; $i ++) {
			$this->code .= $this->charset [mt_rand ( 0, $_len )];
		}
	}
	
	//生成背景
	private function createBg() {
		$this->img = imagecreatetruecolor ( $this->width, $this->height );
		/*背景颜色*/
		/*
        $red = mt_rand(157, 255);
        $green = mt_rand(157, 255);
        $blue = mt_rand(157, 255);*/
		$red = 255;
		$green = 255;
		$blue = 255;
		$color = imagecolorallocate ( $this->img, $red, $green, $blue );
		imagefilledrectangle ( $this->img, 0, $this->height, $this->width, 0, $color );
	}
	
	//生成文字
	private function createFont() {
		$_x = $this->width / $this->codelen;
		$red = 4;
		$green = 4;
		$blue = 255;
		for($i = 0; $i < $this->codelen; $i ++) {
			$this->fontcolor = imagecolorallocate ( $this->img, $red, $green, $blue );
			
			$x = $_x * $i * $this->density;
			$x = $i == 0 ? $x + 5 : $x;
			imagettftext ( $this->img, $this->fontsize, mt_rand ( - 30, 30 ), $x, $this->height / 1.4, $this->fontcolor, $this->font, $this->code [$i] );
		}
	}
	
	//生成线条、雪花  默认 线条6 雪花100
	private function createLine() {
		//线条
		for($i = 0; $i < 2; $i ++) {
			$color = imagecolorallocate ( $this->img, mt_rand ( 0, 156 ), mt_rand ( 0, 156 ), mt_rand ( 0, 156 ) );
			imageline ( $this->img, mt_rand ( 0, $this->width ), mt_rand ( 0, $this->height ), mt_rand ( 0, $this->width ), mt_rand ( 0, $this->height ), $color );
		}
		
		//雪花
		for($i = 0; $i < 5; $i ++) {
			$color = imagecolorallocate ( $this->img, mt_rand ( 200, 255 ), mt_rand ( 200, 255 ), mt_rand ( 200, 255 ) );
			imagestring ( $this->img, mt_rand ( 1, 5 ), mt_rand ( 0, $this->width ), mt_rand ( 0, $this->height ), '*', $color );
		}
	
	}
	
	//输出
	private function outPut() {
		header ( 'Content-type:image/png' );
		imagepng ( $this->img );
		imagedestroy ( $this->img );
	}
	
	//对外生成
	public function doimg() {
		$this->createBg ();
		$this->createCode ();
		$this->createLine ();
		$this->createFont ();
		$this->outPut ();
	}
	
	//获取验证码
	public function getCode() {
		return strtolower ( $this->code );
	}

}